﻿//-----------------------------------------------------------------------
// <copyright file="Logs.cs" company="SLWY Enterprises">
// * Copyright (C) 2017 四川商旅无忧科技有限公司 版权所有。
// * version : 1.0
// * author  : qinchaoyue
// * FileName: Logs.cs
// * history : created by qinchaoyue 2017-11-28 11:56:33
// </copyright>
//-----------------------------------------------------------------------

namespace Slwy.Utility.DebugLog
{
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Reflection;
    using System.Text;

    /// <summary>
    /// 最基本的日志记录
    /// 向程序运行路径的 Logs/ 中写入日志
    /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本类
    /// </summary>
    public static class Logs
    {
        /// <summary>
        /// 获取记录文件路径
        /// </summary>
        /// <returns>日志文件路径</returns>
        private static string Path()
        {
            string logPath = System.AppDomain.CurrentDomain.BaseDirectory + @"\Logs\";
            if (!Directory.Exists(logPath))
            {
                Directory.CreateDirectory(logPath);
            }
            return logPath;
        }

        /// <summary>
        /// 错误信息记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="msg">记录的内容</param>
        public static void Err(string msg)
        {
            string logPath = Path() + "err.log";

            StackTrace trace = new StackTrace();
            MethodBase methodBase = trace.GetFrame(1).GetMethod();
            msg = $"方法 {methodBase.Name} 异常: {msg}";

            Note(logPath, msg, true);
        }

        /// <summary>
        /// 错误信息记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="e"></param>
        public static void Err(Exception e)
        {
            var msg = "Form: " + e.InnerException.Source + "\r\nMsg: " + e;
            Err(msg);
        }

        /// <summary>
        /// 记录警告信息
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="msg">内容</param>
        public static void Warning(string msg)
        {
            Note(Path() + "Warning.log",msg,true);
        }

        /// <summary>
        /// 错误信息记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="msg">记录的内容</param>
        /// <param name="name">文件名字</param>
        public static void Err(string msg, string name)
        {
            string path = Path() + DateTime.Now.ToString("yyyyMMdd") + "[" + name + "][err].log";
            Note(path, msg, true);
        }

        /// <summary>
        /// 错误信息记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="method">方法</param>
        /// <param name="param">参数</param>
        /// <param name="discription">描述</param>
        public static void Err(string method, string param ,string discription)
        {
            string message = "方法: " + method + "\r\n参数:" + param + "\r\n描述:" + discription;
            Err(message);
        }

        /// <summary>
        /// 日志记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="msg">记录的内容</param>
        public static void Note(string msg)
        {
            //Console.WriteLine(msg);
            string logPath = Path() + "note.log";
            Note(logPath, msg, true);
        }

        /// <summary>
        /// 日志记录
        /// 日志自动记录调用者的名字
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="msg">记录的信息</param>
        public static void MethodNote(string msg)
        {
            StackTrace trace = new StackTrace();
            MethodBase metbodBase = trace.GetFrame(1).GetMethod();
            Note(Path() + "note.log", metbodBase.Name + ":" + msg);
        }

        /// <summary>
        /// 日志记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="path">日志文件路径</param>
        /// <param name="msg">内容</param>
        public static void Note(string path, string msg)
        {
            Note(path, msg, false);
        }

        /// <summary>
        /// 日志记录
        /// 请在所有的日志记录都无法使用的情况下使用下, 再使用本方法
        /// </summary>
        /// <param name="msg">记录的内容</param>
        /// <param name="path">日志文件路径</param>
        /// <param name="format">是否格式化信息</param>
        public static void Note(string path, string msg, bool format)
        {
            try
            {
                if (path.IndexOf('\\') == -1)
                    path = Path() + DateTime.Now.ToString("yyyyMMdd") + "[" + path + "][note].log";
                if (!File.Exists(path))
                {
                    FileStream fs = File.Create(path);
                    fs.Dispose();
                    fs.Close();
                }
                using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Write))
                {
                    StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
                    if (format) sw.WriteLine(DateTime.Now + "  " + msg);
                    else sw.WriteLine(msg);
                    sw.Dispose();
                    sw.Close();
                }
            }
            catch
            {
            }
        }

    }
}
